package formal.string;

import java.util.HashMap;

/**
 * @author DengYuan2
 * @create 2021-01-11 21:56
 */
public class E_242 {
    public static void main(String[] args) {
        String s = "anagram";
        String t = "nagaram";
//        String s = "rat";
//        String t = "car";
        boolean res = isAnagram2(s, t);
        System.out.println(res);
    }

    /**
     * 我的写法-用的hashmap，很慢很慢
     * 不过，我这个也适用于unicode时
     * @param s
     * @param t
     * @return
     */
    public static boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        HashMap<Character, Integer> map = new HashMap<>();
        char[] cs = s.toCharArray();
        char[] ts = t.toCharArray();
        for (int i = 0; i < s.length(); i++) {
            map.put(cs[i], 1 + map.getOrDefault(cs[i], 0));
        }
//        for (int i = 0; i < t.length(); i++) {
//            if (!map.containsKey(ts[i]) || map.get(ts[i]) == 0) {
//                return false;
//            }
//            map.put(ts[i], map.get(ts[i]) - 1);
//        }

        //按照官方，可如下进行修改
        for (char c:ts){
            map.put(c,map.getOrDefault(c,0)-1);
            if (map.get(c)<0){
                return false;
            }
        }
        return true;
    }

    /**
     * 大神的写法-合理利用数组及其索引啊！！！
     * string-char-int的关系
     * @param s
     * @param t
     * @return
     */
    public static boolean isAnagram2(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] array = new int[26];
        char[] cs = s.toCharArray();
        char[] ct = t.toCharArray();
        for (char c:cs){
            array[c-'a']++;
        }
//        for (char c:ct){
//            array[c-'a']--;
//        }
//        for (int i:array){
//            if (i!=0){
//                return false;
//            }
//        }

        //官方对62-69行做的简化
        for (char c:ct){
            array[c-'a']--;
            if (array[c-'a']<0){
                return false;
            }
        }
        return true;
    }
}
